int injected=0;
uint64_t isr;
IA64_PSR vpsr;
-
+ REGS *regs=vcpu_regs(vcpu);
local_irq_save(spsr);
h_pending = highest_pending_irq(vcpu);
if ( h_pending == NULL_VECTOR ) goto chk_irq_exit;
isr = vpsr.val & IA64_PSR_RI;
if ( !vpsr.ic )
panic("Interrupt when IC=0\n");
- vmx_reflect_interruption(0,isr,0, 12 ); // EXT IRQ
+ vmx_reflect_interruption(0,isr,0, 12, regs ); // EXT IRQ
injected = 1;
}
else if ( mask == IRQ_MASKED_BY_INSVC ) {
{
IA64_PSR vpsr;
uint64_t isr;
-
+ REGS *regs=vcpu_regs(vcpu);
vpsr.val = vmx_vcpu_get_psr(vcpu);
update_vhpi(vcpu, NULL_VECTOR);
isr = vpsr.val & IA64_PSR_RI;
if ( !vpsr.ic )
panic("Interrupt when IC=0\n");
- vmx_reflect_interruption(0,isr,0, 12 ); // EXT IRQ
+ vmx_reflect_interruption(0,isr,0, 12, regs); // EXT IRQ
}
vhpi_detection(VCPU *vcpu)
thash_data_t *tlb;
ia64_rr vrr;
u64 mfn;
-
+
if ( !(VCPU(vcpu, vpsr) & IA64_PSR_IT) ) { // I-side physical mode
gpip = gip;
}
else {
vmx_vcpu_get_rr(vcpu, gip, &vrr.rrval);
- tlb = vtlb_lookup_ex (vmx_vcpu_get_vtlb(vcpu),
+ tlb = vtlb_lookup_ex (vmx_vcpu_get_vtlb(vcpu),
vrr.rid, gip, ISIDE_TLB );
- if ( tlb == NULL ) panic("No entry found in ITLB\n");
+ if( tlb == NULL )
+ tlb = vtlb_lookup_ex (vmx_vcpu_get_vtlb(vcpu),
+ vrr.rid, gip, DSIDE_TLB );
+ if ( tlb == NULL ) panic("No entry found in ITLB and DTLB\n");
gpip = (tlb->ppn << 12) | ( gip & (PSIZE(tlb->ps)-1) );
}
mfn = __gpfn_to_mfn(vcpu->domain, gpip >>PAGE_SHIFT);
if ( mfn == INVALID_MFN ) return 0;
-
+
mpa = (gpip & (PAGE_SIZE-1)) | (mfn<<PAGE_SHIFT);
*code = *(u64*)__va(mpa);
return 1;
#include <asm/kregs.h>
#include <asm/vmx.h>
#include <asm/vmx_mm_def.h>
+#include <asm/vmx_phy_mode.h>
#include <xen/mm.h>
/* reset all PSR field to 0, except up,mfl,mfh,pk,dt,rt,mc,it */
#define INITIAL_PSR_VALUE_AT_INTERRUPTION 0x0000001808028034
extern ia64_rr vmx_vcpu_rr(VCPU *vcpu,UINT64 vadr);
+static int vmx_handle_lds(REGS* regs)
+{
+ regs->cr_ipsr |=IA64_PSR_ED;
+ return IA64_FAULT;
+}
+
/* We came here because the H/W VHPT walker failed to find an entry */
void vmx_hpw_miss(u64 vadr , u64 vec, REGS* regs)
{
return;
}
*/
-
- if((vec==1)&&(!vpsr.it)){
- physical_itlb_miss(v, vadr);
- return;
- }
- if((vec==2)&&(!vpsr.dt)){
- if(v->domain!=dom0&&__gpfn_is_io(v->domain,(vadr<<1)>>(PAGE_SHIFT+1))){
- emulate_io_inst(v,((vadr<<1)>>1),4); // UC
- }else{
- physical_dtlb_miss(v, vadr);
+ if(is_physical_mode(v)&&(!(vadr<<1>>62))){
+ if(vec==1){
+ physical_itlb_miss(v, vadr);
+ return;
+ }
+ if(vec==2){
+ if(v->domain!=dom0&&__gpfn_is_io(v->domain,(vadr<<1)>>(PAGE_SHIFT+1))){
+ emulate_io_inst(v,((vadr<<1)>>1),4); // UC
+ }else{
+ physical_dtlb_miss(v, vadr);
+ }
+ return;
}
- return;
}
vrr = vmx_vcpu_rr(v, vadr);
if(vec == 1) type = ISIDE_TLB;
} else{
if(misr.sp){
//TODO lds emulation
- panic("Don't support speculation load");
+ //panic("Don't support speculation load");
+ return vmx_handle_lds(regs);
}else{
nested_dtlb(v);
return IA64_FAULT;
return IA64_FAULT;
}else{
if(misr.sp){
- //TODO lds emulation
- panic("Don't support speculation load");
+ //TODO lds emulation
+ //panic("Don't support speculation load");
+ return vmx_handle_lds(regs);
}else{
nested_dtlb(v);
return IA64_FAULT;
return IA64_FAULT;
}else{
if(misr.sp){
- //TODO lds emulation
- panic("Don't support speculation load");
+ //TODO lds emulation
+ //panic("Don't support speculation load");
+ return vmx_handle_lds(regs);
}else{
nested_dtlb(v);
return IA64_FAULT;
IA64FAULT vmx_emul_mov_to_dbr(VCPU *vcpu, INST64 inst)
{
+ return IA64_NO_FAULT;
u64 r3,r2;
#ifdef CHECK_FAULT
IA64_PSR vpsr;
IA64FAULT vmx_emul_mov_to_ibr(VCPU *vcpu, INST64 inst)
{
+ return IA64_NO_FAULT;
u64 r3,r2;
#ifdef CHECK_FAULT
IA64_PSR vpsr;
case 74:return vmx_cr_get(cmcv);
case 80:return vmx_cr_get(lrr0);
case 81:return vmx_cr_get(lrr1);
- default:
- panic("Read reserved cr register");
+ default: return IA64_NO_FAULT;
}
}
#if 1
vrr=vmx_vcpu_rr(current, va);
if (vrr.ps != entry->ps) {
+ machine_tlb_insert(hcb->vcpu, entry);
printk("not preferred ps with va: 0x%lx\n", va);
return;
}